package cn.tedu.charging.order.config;

import cn.tedu.charging.order.context.consumer.MqttConsumer;
import cn.tedu.charging.order.context.MqttContext;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 作为整合emqx的客户端代码对象配置类
 * 给我们提供一个可以连接本地emqx的client对象 在容器中主驻留
 */
@Configuration
@Slf4j
public class MqttConfiguration {
    @Autowired
    private MqttContext mqttContext;
    /**
     * 连接地址 tcp 协议 1883 端口号
     * 配置信息 应该 放到配置文件 或者放到 配置中心 nacos
     */
    @Value("${mqtt.address}")
    private String address;
    /**
     * 客户端ID
     * 相同的id EMQX 不允许同时连接 不能同时在线
     * 为了让多个订单服务 同时能连接上EMQX ，
     * 给每个订单服务都分配一个不同的客户端ID 用随机数来实现
     */
    @Value("${mqtt.client-id}")
    private String clientId;
    /**
     * 用户名
     * 配置信息 应该 放到配置文件 或者放到 配置中心 nacos
     */
    @Value("${mqtt.username}")
    private String username;
    /**
     * 密码
     * 配置信息 应该 放到配置文件 或者放到 配置中心 nacos
     */
    @Value("${mqtt.password}")
    private String password;
    @Bean
    public MqttClient mqttClient() throws Exception {
        //通过 连接地址 和 客户端id创建 MqttClient 对象
        MqttClient mqttClient = new MqttClient(address, clientId,null);
        // 创建 MqttConnectOptions 连接相关的配置
        MqttConnectOptions options = new MqttConnectOptions();
        //配置用户名
        options.setUserName(username);
        //配置密码 char[] 字符串转成字符数组 password.toCharArray()
        // 把 字符串 转换为 字符数组
        //字符串常用的方法 大家得关注 String
        options.setPassword(password.toCharArray());
        //设置自动重连
        options.setAutomaticReconnect(true);
        //options 有很多其他的配置 可以自己了解
    /*  options.setCleanSession(true);
        options.setKeepAliveInterval(60);
        options.setConnectionTimeout(30);
        options.setMaxInflight(100);
        options.setAutomaticReconnect(true);
        options.setExecutorServiceTimeout(1000);
  */
        MqttConsumer mqttConsumer = new MqttConsumer(mqttContext,mqttClient);
        mqttClient.setCallback(mqttConsumer);
        // 通过配置和EMQX进行连接
        mqttClient.connect(options);
        log.debug("mqttClient.connect mqtt客户端试图和EMQX连接，是否连接成功不知道，连接成功的结果" +
                "是通过 Callback 回调，连接结果来调用callback里的方法 connectComplete");
        return mqttClient;
    }
}
